package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.FileUploadUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * @author LT
 * @version 1.0.0
 * @ClassName ContractProductController.java
 * @Description TODO
 * @createTime 2020年04月01日 16:04:00
 */
@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {

    @Reference
    private ContractProductService contractProductService;

    @Reference
    private FactoryService factoryService;

    //从spring容器中获取fileuploadUitl对象
    @Autowired
    private FileUploadUtil fileUploadUtil;

    /**
     * 展示货物的列表
     * url: http://locallhost:8080/cargo/contractProduct/list.do
     *
     * @param contractId
     * @param pageNum
     * @param pageSize
     * @return 货物的列表页面
     */
    @RequestMapping("/list.do")
    public String list(String contractId,
                       @RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "8") int pageSize) {
        //1. 根据购销合同的id， 查询货物的数据
        ContractProductExample contractProductExample = new ContractProductExample();

        //添加查询的条件， 根据购销合同id查询
        ContractProductExample.Criteria criteria = contractProductExample.createCriteria();
        criteria.andContractIdEqualTo(contractId);
        PageInfo<ContractProduct> pageInfo = contractProductService.findByPage(contractProductExample, pageNum, pageSize);
        request.setAttribute("pageInfo", pageInfo);

        //2. 查询生产货物厂家的数据
        FactoryExample factoryExample = new FactoryExample();
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList", factoryList);

        //3. 购销合同的id
        request.setAttribute("contractId", contractId);
        return "cargo/product/product-list";
    }

    /**
     * 保存添加货物
     * url ： cargo/contractProduct/edit.do
     *
     * @param contractProduct
     * @param productPhoto
     * @return
     */
    @RequestMapping("edit")
    public String edit(ContractProduct contractProduct, MultipartFile productPhoto) {
        //由于后期需要使用到某些数据，所以我们需要补全数据
        //货物的所属公司的id
        contractProduct.setCompanyId(getLoginCompanyId());
        //货物的所属公司的名字
        contractProduct.setCompanyName(getLoginCompanyName());
        //货物创建人
        contractProduct.setCreateBy(getLoginUser().getId());
        //货物创建人所属的部门
        contractProduct.setCreateDept(getLoginUser().getDeptId());

        //先判断用户是否上传图片
        if (productPhoto != null) {
            //实现文件上传
            try {
                //返回的是图片存储到服务器地址.
                String url = fileUploadUtil.upload(productPhoto);
                // 记录图片的地址
                contractProduct.setProductImage("http://" + url);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (StringUtils.isEmpty(contractProduct.getId())) {
            //保存
            contractProductService.save(contractProduct);
        } else {
            //更新
            contractProductService.update(contractProduct);
        }
        //返回值一旦添加redirect或者是forward，那么则没有经过视图解析器。
        return "redirect:/cargo/contractProduct/list.do?contractId=" + contractProduct.getContractId();
        //        return "contractProduct/list.do"; // /WEB-INF/pages/contractProduct/list.do.jsp
    }

    /**
     * 进入修改货物页面
     * url ： /contractProduct/toUpdate.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41
     *
     * @param id
     * @return
     */
    @RequestMapping("toUpdate")
    public String toUpdate(String id) {
        // 1.根据货物的id查找对应货物对象
        ContractProduct contractProduct = contractProductService.findById(id);
        request.setAttribute("contractProduct", contractProduct);

        // 2.查询生产货物的厂家列表
        FactoryExample factoryExample = new FactoryExample();
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList", factoryList);

        // 3.返回到更新页面
        return "cargo/product/product-update";
    }

    /**
     * 根据id删除货物
     * url ： //contractProduct/delete.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41&contractId=xxx
     *
     * @param id
     * @param contractId
     * @return
     */
    @RequestMapping("delete")
    public String delete(String id, String contractId) {
        contractProductService.delete(id);
        return "redirect:/cargo/contractProduct/list.do?contractId=" + contractId;
    }

    /*
     作用: 进入上传货物的页面
     url ：/cargo/contractProduct/toImport.do?contractId=dbb1e341-4c5b-4b50-8c92-271c6c505b5b
     参数： contractId  购销合同的id
     返回： 返回到上传货物的页面
    */
    @RequestMapping("toImport")
    public String toImport(String contractId) {
        request.setAttribute("contractId", contractId);
        return "cargo/product/product-import";
    }

    /**
     * 保存上传excel的货物数据
     * url ：/cargo/contractProduct/import.do
     *
     * @param contractId 购销合同的id
     * @param file       上传的excel文件
     * @return 返回到上传货物的列表
     * @throws IOException
     */
    @RequestMapping("import")
    public String importExcel(String contractId, MultipartFile file) throws IOException {
        // 1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook(file.getInputStream());
        // 2.读取工作单
        Sheet sheet = workbook.getSheetAt(0);
        // 3.获取总的行数
        int rows = sheet.getPhysicalNumberOfRows();

        //4. 遍历读取整个excel数据，注意：每一行就是一个货物的数据
        for (int i = 1; i < rows; i++) {
            // 获取行
            Row row = sheet.getRow(i);
            // 每一行就是一个货物的数据，所有我们创建一个货物的对象
            ContractProduct contractProduct = new ContractProduct();
            // 读取单元格的数据封装到contractProduct对象中

            //生产厂家
            if (row.getCell(1) != null) {
                // 读取数据
                String factoryName = row.getCell(1).getStringCellValue();
                // 把数据封装到货物对象
                contractProduct.setFactoryName(factoryName);
            }

            //货号
            if (row.getCell(2) != null) {
                // 读取数据
                String productNo = row.getCell(2).getStringCellValue();
                // 把数据封装到货物对象
                contractProduct.setProductNo(productNo);
            }

            //数量
            if (row.getCell(3) != null) {
                //读取数据
                double cnumber = row.getCell(3).getNumericCellValue();
                //把数据封装到货物对象
                contractProduct.setCnumber((int) cnumber);
            }

            //包装单位
            if (row.getCell(4) != null) {
                //读取数据
                String packingUnit = row.getCell(4).getStringCellValue();
                //把数据封装到货物对象
                contractProduct.setPackingUnit(packingUnit);
            }

            //转换率
            if (row.getCell(5) != null) {
                //读取数据
                double loadingRate = row.getCell(5).getNumericCellValue();
                //把数据封装到货物对象
                contractProduct.setLoadingRate(loadingRate + "");
            }

            //箱数
            if (row.getCell(6) != null) {
                //读取数据
                double boxNum = row.getCell(6).getNumericCellValue();
                //把数据封装到货物对象
                contractProduct.setBoxNum((int) boxNum);
            }

            //价格
            if (row.getCell(7) != null) {
                //读取数据
                double price = row.getCell(7).getNumericCellValue();
                //把数据封装到货物对象
                contractProduct.setPrice(price);
            }

            //产品说明
            if (row.getCell(8) != null) {
                //读取数据
                String productDesc = row.getCell(8).getStringCellValue();
                //把数据封装到货物对象
                contractProduct.setProductDesc(productDesc);
            }

            //产品要求
            if (row.getCell(9) != null) {
                //读取数据
                String productRequest = row.getCell(9).getStringCellValue();
                //把数据封装到货物对象
                contractProduct.setProductRequest(productRequest);
            }

            //补全数据 (因为有些数据我们在后期做统计模块的时候要使用到)
            //货物所属的公司id与nanme
            //该货物所属的购销合同id
            contractProduct.setContractId(contractId);
            // 货物的生产厂家的id
            contractProduct.setCompanyId(getLoginCompanyId());
            contractProduct.setCompanyName(getLoginCompanyName());

            // 根据厂家的名字查找厂家
            Factory factory = factoryService.findByFactoryName(contractProduct.getFactoryName());
            // 获取厂家的id
            contractProduct.setFactoryId(factory.getId());
            // 把获取的数据插入到数据库中
            contractProductService.save(contractProduct);
        }
        return "redirect:/cargo/contractProduct/list.do?contractId=" + contractId;
    }

}


